// 录音js， wav格式适用于语音测评的
import Recorder from 'recorder-core';
import 'recorder-core/src/engine/mp3';
import 'recorder-core/src/engine/wav';
import 'recorder-core/src/engine/mp3-engine';
import { utilJs } from "@/utils/common.js";
//主要包括：Chrome、Firefox、Safari、Android WebView、腾讯Android X5内核(QQ、微信)；不支持：UC系内核（典型的支付宝，大部分国产手机厂商的浏览器），IOS上除Safari外的其他任何形式的浏览器（含PWA、WebClip、任何App内网页）。
var uploadUrl = "https://upload.qiniup.com/";
var qiniuUrl = "https://qnoss.ckjr001.com/";
var rec;
var record = {
  /*调用open打开录音请求好录音权限*/
  recOpen: (success, failCallback, voiceType = 'mp3') => { //一般在显示出录音按钮或相关的录音界面时进行此方法调用，后面用户点击开始录音时就能畅通无阻了
    let br = voiceType == "mp3" ? 32 : 16;
    let sr = voiceType == "mp3" ? 48000 : 16000;
    rec = Recorder({
      type: voiceType,
      sampleRate: sr,
      bitRate: br, //mp3格式，指定采样率hz、比特率kbps，其他参数使用默认配置；注意：是数字的参数必须提供数字，不要用字符串；需要使用的type类型，需提前把格式支持文件加载进来，比如使用wav格式需要提前加载wav.js编码引擎
      onProcess: (buffers, powerLevel, bufferDuration, bufferSampleRate, newBufferIdx, asyncEnd) => {
        //录音实时回调，大约1秒调用12次本回调
        //可利用extensions/waveview.js扩展实时绘制波形
        //可利用extensions/sonic.js扩展实时变速变调，此扩展计算量巨大，onProcess需要返回true开启异步模式
      }
    });
    rec.open(() => { //打开麦克风授权获得相关资源
      success && success();
    }, (msg, isUserNotAllow) => { //用户拒绝未授权或不支持
      Vue.prototype.$showCjToast({
        text: "用户未授权或浏览器不支持",
        type: 'warn',
      });
      failCallback && failCallback();
      console.log((isUserNotAllow ? "UserNotAllow，" : "") + "无法录音:" + msg);
    });
  },

  /**开始录音**/
  recStart: () => { //打开了录音后才能进行start、stop调用
    rec.start();
  },

  /**60s后自动结束录音**/
  recVoiceRecordEnd: (scallBack) => {
    let num = 0;
    let en = setInterval(() => {
      if (rec == null) {
        clearInterval(en);
        return;
      }
      if (num >= 60) {
        clearInterval(en);
        record.recStop(scallBack);
      }
      num++;
    }, 1000);
  },

  /**结束录音**/
  recStop: (scallBack) => {
    rec.stop((blob, duration) => {
      console.log(blob, (window.URL || webkitURL).createObjectURL(blob), "时长:" + duration + "ms"); // eslint-disable-line
      rec.close(); //释放录音资源，当然可以不释放，后面可以连续调用start；但不释放时系统或浏览器会一直提示在录音，最佳操作是录完就close掉
      rec = null;
      scallBack && scallBack(blob);
    }, msg => {
      console.log("录音失败:" + msg);
      rec.close(); //可以通过stop方法的第3个参数来自动调用close
      rec = null;
    });
  },
  /**杀掉录音进程，释放资源**/
  recClose: () => {
    //释放录音资源，当然可以不释放，后面可以连续调用start；但不释放时系统或浏览器会一直提示在录音，最佳操作是录完就close掉
    if (rec) {
      rec.close();
    }
  },
  /**上传音频文件到七牛**/
  uploadAudioFile: (blob, qiniuInfo, scallBack, errorCallBack) => {
    let bType = blob.type == "audio/wav" ? ".wav" : ".mp3";
    let uId = localStorage.getItem("userId") ? localStorage.getItem("userId") : Math.ceil(Math.random() * 1000);
    let key = (new Date().getTime()) + "_mp_voice_" + uId + bType;
    let formData = new FormData();
    formData.append('token', qiniuInfo.qiNiuToken);
    formData.append('file', blob);
    if (blob.type == "audio/wav") {
      formData.append("key", key);
    }
    utilJs.postFileMethod(uploadUrl, formData, res => {
      let url = qiniuUrl + res.key;
      scallBack && scallBack(url);
    }, fres => {
      console.log("上传音频文件到七牛失败");
      errorCallBack && errorCallBack();
    });
  },
}

export default record
